#ifndef __TAMPON_PARTAGE_H
#define __TAMPON_PARTAGE_H

#include "mutex.h"
#include "semaphore.h"
#include "condition.h"
#include "autoverrou.h"
#include "commun/tampon.h"

/**
 * Représente un tampon partagé avec synchronisation, reprenant
 * le problème des producteurs et des consommateurs.
 * Nous avons hésité à utiliser un tampon sans verrou que nous aurions 
 * repêché de Midishare (un truc qui fait un peu comme nous, finalement, mais
 * en sérieux). Malheureusement, il y avait trop d'assembleur et trop de Compare
 * and Swap pour nos petites cervelles.
 */
template <class T, int Capacite>
class tampon_partage {
	mutex mon_mutex_;
	condition condition_vide_;
	condition condition_plein_;
	tampon<T,Capacite> tampon_;
public:
	tampon_partage() throw() {}
	void deposer(T valeur) {
		autoverrou av(mon_mutex_);
		if(tampon_.est_plein()) // on attend le prochain signal
			condition_plein_.attendre(mon_mutex_);
		tampon_.deposer(valeur);
		condition_vide_.provoquer();
	}
	T prelever() {
		autoverrou av(mon_mutex_);
		if(tampon_.est_vide()) // on attend le prochain signal
			condition_vide_.attendre(mon_mutex_);
		T valeur = tampon_.prelever();
		condition_plein_.provoquer();
		return valeur;
	}
};

#endif
